Code to run analysis and generate figures for McNeall et al. (2022) “Constraining the carbon cycle in JULES-ES-1.0”
Loading required package: spam
Loading required package: dotCall64
Loading required package: grid
Spam version 2.7-0 (2021-06-25) is loaded.
Type 'help( Spam)' or 'demo( spam)' for a short introduction
and overview of this package.
Help for individual functions is also obtained by adding the
suffix '.spam' to the function name, e.g. 'help( chol.spam)'.
Attaching package: ‘spam’
The following objects are masked from ‘package:base’:
backsolve, forwardsolve
Loading required package: viridis
Loading required package: viridisLite
replacing previous import ‘lifecycle::last_warnings’ by ‘rlang::last_warnings’ when loading ‘tibble’replacing previous import ‘lifecycle::last_warnings’ by ‘rlang::last_warnings’ when loading ‘pillar’See https://github.com/NCAR/Fields for
an extensive vignette, other supplements and source code
Loading required package: lhs
Loading required package: parallel
Loading required package: viztools
Failure analysis

Visualising the ensemble range
It’s important to remember that the design of the experiment is multiplication factors of the original parameters. This might be important for the “hold” value in a sensitivity analysis, as the “standard” value and the median value of the ensemble will not be the same.

Wave00/Wave01 Ensemble behaviour in key (constraining) outputs.
Global mean for the 20 years at the end of the 20th Century. There is still a significant low bias on cVeg output.

What proportion of wave01 fall within Andy Wiltshire’s constraints?
Just under a third. Points at a significant model discrepency in cVeg
Of the 400 members of the wave01 ensemble, 128 pass Andy Wiltshire’s Level 2 constraints.
[1] 128
[1] 0.32


Exploring summary of constraint: Cumulative NBP
Carbon budget data
Section 2.5 in Friedlingstein et al. describes how the land carbon sink is estimated.
IPCC AR6 Chapter 5 states: “The net land carbon sink is taken as net biome productivity (NBP) and so includes any modelled net land-use change emissions. Further details on data sources and processing are available in the chapter data table (Table 5.SM.6).”
The GCP says: “The land sink is the average of several dynamic global vegetation models that reproduce the observed mean total land sink of the 1990s.”
AR6 Chapter 5 states: "The land carbon cycle components of historical ESM simulations show a larger range, with simulated cumulative land carbon uptake (1850–2014) spanning the range from –47 to +21 GtC, compared to the GCP estimate of –12 ± 50 GtC (Figure 5.23b).




How much are all select output constrained?

Constraint of output at level 2
Proportion of the initial range of model output that is covered by level 2 constrained ensemble (%):
npp nbp cSoil cVeg lai_lnd_mean rh_lnd_sum
26.6 55.1 48.3 23.5 60.9 26.0
fLuc_lnd_sum fHarvest_lnd_sum treeFrac_lnd_mean shrubFrac_lnd_mean baresoilFrac_lnd_mean c3PftFrac_lnd_mean
51.5 60.7 88.3 85.4 52.9 58.0
c4PftFrac_lnd_mean
43.9

Pairs plot of 2d projections of constrained output space.

Constraining to level 2 with the emulator

LS0tCnRpdGxlOiAiQ29uc3RyYWluaW5nIHRoZSBjYXJib24gY3ljbGUgaW4gSlVMRVMtRVMtMS4wIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCgpDb2RlIHRvIHJ1biBhbmFseXNpcyBhbmQgZ2VuZXJhdGUgZmlndXJlcyBmb3IgTWNOZWFsbCBldCBhbC4gKDIwMjIpICJDb25zdHJhaW5pbmcgdGhlIGNhcmJvbiBjeWNsZSBpbiBKVUxFUy1FUy0xLjAiCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CiMgTG9hZCBoZWxwZXIgZnVuY3Rpb25zCgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnBhdGggPSAiZmlncy8iLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZ3MgPSBGQUxTRSkKCgpgYGAKCmBgYHtyfQoKc291cmNlKCJKVUxFUy1FUy0xcDAtY29tbW9uLXBhY2thZ2VzLlIiKQpzb3VyY2UoIkpVTEVTLUVTLTFwMC1jb21tb24tZnVuY3Rpb25zLlIiKQpzb3VyY2UoIkpVTEVTLUVTLTFwMC1jb21tb24tZGF0YS5SIikKCmBgYAoKIyMgRmFpbHVyZSBhbmFseXNpcwoKYGBge3IgZmFpbHVyZS1wYWlycywgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCBmaWcucGF0aD0nZmlncy8nLCBkZXY9YygncG5nJywgJ3BkZicpfQoKCmxvd19ucHBfaXggPC0gd2hpY2goWVssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDFlNSkKIyBjb2RlIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjgxODI4NzIvaG93LXRvLXVzZS1kaWZmZXJlbnQtc2V0cy1vZi1kYXRhLWluLWxvd2VyLWFuZC11cHBlci1wYW5lbC1vZi1wYWlycy1mdW5jdGlvbi1pbgoKCiNYIDwtIG1hdHJpeChydW5pZigzMDApLCBuY29sPTMpCiNZIDwtIG1hdHJpeChjKHNvcnQocnVuaWYoMTAwLCAwLCAxMCkpLCAKIyAgICAgICAgICAgICAgc29ydChydW5pZigxMDAsIDAsIDEwKSksIAojICAgICAgICAgICAgICBzb3J0KHJ1bmlmKDEwMCwgMCwgMTApKSksIG5jb2w9MykKCiNwZGYoZmlsZSA9ICdmaWdzL2ZpZzAyLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwKQojcGRmKGZpbGUgPSAnZmlncy9ydW4tZmFpbHVyZS1wYWlycy5wZGYnLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCkKeDEgPC0gWFtsb3dfbnBwX2l4LCBdCngyIDwtIFhfbmxldmVsMAoKWFkgPC0gcmJpbmQoeDEsIHgyKQoKCnBhaXJzKFhZLAogICAgICBsb3dlci5wYW5lbD1mdW5jdGlvbih4LCB5LCAuLi4pIHsKICAgICAgICBYeCA8LSB4W3NlcV9sZW4obnJvdyh4MSkpXSAjIGNvcnJlc3BvbmRzIHRvIFggc3Vic2V0CiAgICAgICAgWHkgPC0geVtzZXFfbGVuKG5yb3coeDEpKV0gIyBjb3JyZXNwb25kcyB0byBYIHN1YnNldAogICAgICAgICN1c3IgPC0gcGFyKCJ1c3IiKTsgb24uZXhpdChwYXIodXNyKSkKICAgICAgICAjcGFyKHVzciA9IGMocmFuZ2UoeDFbLCAtbmNvbCh4MSldKSwgcmFuZ2UoeDFbLCAtMV0pKSkgIyBzZXQgdXAgbGltaXRzCiAgICAgICAgcG9pbnRzKFh4LCBYeSwgY29sID0gemJsdWUsIHBjaCA9IDE5LCBjZXggPSAwLjgpCiAgICAgICAjIGlmKHBhcignbWZnJylbMl0gPT0gMSkgYXhpcygyKSAjIGlmIGxlZnQgcGxvdCwgYWRkIGxlZnQgYXhpcwogICAgICAgICNpZihwYXIoJ21mZycpWzFdID09IG5jb2woeDEpKSBheGlzKDEpICMgaWYgYm90dG9tIHBsb3QgYWRkIGJvdHRvbSBheGlzCiAgICAgIH0sIAogICAgICB1cHBlci5wYW5lbD1mdW5jdGlvbih4LCB5LCAuLi4pIHsKICAgICAgICBZeCA8LSB4Wyhucm93KHgxKSArIDEpOmxlbmd0aCh4KV0gIyBZIHN1YnNldAogICAgICAgIFl5IDwtIHlbKG5yb3coeDEpICsgMSk6bGVuZ3RoKHkpXSAjIFkgc3Vic2V0CiAgICAgICAgCiAgICAgICAgI2NudHIgPC0gb3V0ZXIoWXgsIFl4LCBGVU49JyonKSAjIGFyYml0cmFyeSBmdW5jdGlvbiBmb3IgY29udG91cgogICAgICAgIyB1c3IgPC0gcGFyKCJ1c3IiKTsgb24uZXhpdChwYXIodXNyKSkKICAgICAgICAjcGFyKHVzciA9IGMocmFuZ2UoeDJbLCAtMV0pLCByYW5nZSh4MlssIC1uY29sKHgyKV0pKSkgIyBzZXQgdXAgbGltaXRzCiAgICAgICAgcG9pbnRzKFl4LCBZeSwgY29sID0genJlZCwgcGNoID0gMTksIGNleCA9IDAuOCkKICAgICAgICAjY29udG91cihZeCwgWXksIGNudHIsIGFkZD1UUlVFKQogICAgICAgICNpZihwYXIoJ21mZycpWzJdID09IG5jb2woeDIpKSBheGlzKDQpICMgaWYgcmlnaHQgcGxvdCwgYWRkIHJpZ2h0IGF4aXMKICAgICAgICAjaWYocGFyKCdtZmcnKVsxXSA9PSAxKSBheGlzKDMpICMgaWYgdG9wIHBsb3QsIGFkZCB0b3AgYXhpcwogICAgICB9LCAKICAgICAgI3RpY2s9RkFMU0UsICMgc3VwcHJlc3MgdGhlIGRlZmF1bHQgdGljayBtYXJrcwogICAgICAjbGluZT0xLAogICAgICBnYXAgPSAwLAogICAgICB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBsYWJlbHMgPSAxOmQsCiAgICAgIG9tYSA9IGMoMiwgMTgsIDIsIDIpKSAjIG1vdmUgdGhlIGRlZmF1bHQgdGljayBsYWJlbHMgb2ZmIHRoZSBwbG90IAoKcmVzZXQoKQoKbGVnZW5kKCdsZWZ0JywgbGVnZW5kID0gcGFzdGUoMTpkLCBjb2xuYW1lcyhsaHMpKSwgY2V4ID0gMS4xLCBidHkgPSAnbicpCmxlZ2VuZCgndG9wbGVmdCcsIHBjaCA9IDE5LCBjb2wgPSBjKCB6cmVkLCB6Ymx1ZSksIGxlZ2VuZCA9IGMoJ2ZhaWxlZCcsICd6ZXJvIGNhcmJvbiBjeWNsZScpLCBidHkgPSAnbicsIGluc2V0ID0gMC4wMiwgY2V4ID0gMS4xICkKCiNkZXYub2ZmKCkKCmBgYAoKIyBWaXN1YWxpc2luZyB0aGUgZW5zZW1ibGUgcmFuZ2UKCkl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgdGhlIGRlc2lnbiBvZiB0aGUgZXhwZXJpbWVudCBpcyBtdWx0aXBsaWNhdGlvbiBmYWN0b3JzIG9mIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXJzLiBUaGlzIG1pZ2h0IGJlIGltcG9ydGFudCBmb3IgdGhlICJob2xkIiB2YWx1ZSBpbiBhIHNlbnNpdGl2aXR5IGFuYWx5c2lzLCBhcyB0aGUgInN0YW5kYXJkIiB2YWx1ZSBhbmQgdGhlIG1lZGlhbiB2YWx1ZSBvZiB0aGUgZW5zZW1ibGUgd2lsbCBub3QgYmUgdGhlIHNhbWUuCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDh9CgojcGRmKGZpbGUgPSAnZmlncy9saHNfcmFuZ2UucGRmJywgd2lkdGggPSA2LCBoZWlnaHQgPSA4KQojcGRmKGZpbGUgPSAnZmlncy9maWcwMS5wZGYnLCB3aWR0aCA9IDYsIGhlaWdodCA9IDgpCnBhcihsYXMgPSAxLCBtYXIgPSBjKDUsOCwyLDEpKQpsaHNfbWluIDwtIGFwcGx5KGxoc193YXZlMF93YXZlMDFfYWxsLCAyLCBtaW4pCmxoc19tYXggPC0gYXBwbHkobGhzX3dhdmUwX3dhdmUwMV9hbGwsMiwgbWF4KQoKcGxvdChsaHNfbWF4LCAxOmQsIHR5cGUgPSAnbicsIHhsaW0gPSBjKDAsMTApLCBheGVzID0gRkFMU0UsIHhsYWIgPSAnbXVsdGlwbHlpbmcgZmFjdG9yJywgeWxhYiA9ICcnKQoKYWJsaW5lKHYgPSAwLCBsdHkgPSAnZGFzaGVkJywgY29sID0gJ2dyZXknKQphYmxpbmUodiA9IDEsIGx0eSA9ICdkYXNoZWQnLCBjb2wgPSAndG9tYXRvMicpCgpzZWdtZW50cyh4MCA9IGxoc19taW4sIHkwID0gMTpkLCB4MSA9IGxoc19tYXgsIHkxID0gMTpkICkKcG9pbnRzKGxoc19taW4sIDE6ZCwgcGNoID0gMjApCnBvaW50cyhsaHNfbWF4LCAxOmQsIHBjaCA9IDIwKQpheGlzKDIsIGF0ID0gMTpkLCBsYWJlbHMgPSBjb2xuYW1lcyhsaHMpKQpheGlzKDEpCiNkZXYub2ZmKCkKCmBgYAoKIyMgV2F2ZTAwL1dhdmUwMSAgRW5zZW1ibGUgYmVoYXZpb3VyIGluIGtleSAoY29uc3RyYWluaW5nKSBvdXRwdXRzLiAKCkdsb2JhbCBtZWFuIGZvciB0aGUgMjAgeWVhcnMgYXQgdGhlIGVuZCBvZiB0aGUgMjB0aCBDZW50dXJ5LiBUaGVyZSBpcyBzdGlsbCBhIHNpZ25pZmljYW50IGxvdyBiaWFzIG9uIGNWZWcgb3V0cHV0LgoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA4fQp3YXZlMDBjb2wgPC0gJ3NreWJsdWUyJwp3YXZlMDFjb2wgPC0gJ3RvbWF0bzInCgp3YXZlMDBjb2wgPC0gJ2RvZGdlcmJsdWUyJwp3YXZlMDFjb2wgPC0gJ2ZpcmVicmljaycKcmFuZ2Vjb2wgPC0gJ2dyZXknCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOCB9CiMgSGlzdG9ncmFtIG9mIGxldmVsIDEgY29uc3RyYWludHMKaGNvbCA9ICdkYXJrZ3JleScKbGNvbCA9ICdibGFjaycKCiNwZGYoZmlsZSA9ICdmaWdzL2ZpZzA1LnBkZicsIHdpZHRoID0gOCwgaGVpZ2h0ID0gOCkKI3BkZihmaWxlID0gJ2ZpZ3MvbGV2ZWxfMl9jb25zdHJhaW50c19oaXN0cy5wZGYnLCB3aWR0aCA9IDgsIGhlaWdodCA9IDgpCnBhcihtZnJvdyA9IGMoMiwyKSwgZmcgPSAnZGFya2dyZXknLCBsYXMgPSAxLCBvbWEgPSBjKDAuMSwgMC4xLCA0LCAwLjEpKQoKdHJ1bmMgPC0gZnVuY3Rpb24oeCwgdmVjKXsKICAKICBkYXQgPC0geFt4IDwgbWF4KHZlYykgJiB4ID4gbWluKHZlYykgIF0KICAKICBkYXQKICAKfQoKCmggPC0gaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbmJwX2xuZF9zdW0nXSwgbWFpbiA9ICdOQlAnLCB4bGFiID0gJ0d0Qy95ZWFyJywgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApKQpoaXN0KHRydW5jKFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCBbLCduYnBfbG5kX3N1bSddLCBoJGJyZWFrcykgLAogICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsMTUwKSAsIGJyZWFrcyA9IGgkYnJlYWtzLCBhZGQgPSBUUlVFKQoKcnVnKFlfY29uc3Rfc3Rhbl9zY2FsZWRbJ25icF9sbmRfc3VtJ10sIGx3ZCA9IDIpCgpwb2x5Z29uKHggPSBjKDAsIDEwMCwgMTAwLCAwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCksCiAgICAgICAgYm9yZGVyID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sKSkKCmggPC0gaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnbnBwX25saW1fbG5kX3N1bSddLGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsMTUwKSwgbWFpbiA9ICdOUFAnLCB4bGFiID0gJ0d0Qy95ZWFyJykKaGlzdCh0cnVuYyhZX2NvbnN0X3dhdmUwMV9zY2FsZWQgWywnbnBwX25saW1fbG5kX3N1bSddLCBoJGJyZWFrcykgLCAKICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sKSAsIGJyZWFrcyA9IGgkYnJlYWtzLCBhZGQgPSBUUlVFKQoKcnVnKFlfY29uc3Rfc3Rhbl9zY2FsZWRbJ25wcF9ubGltX2xuZF9zdW0nXSwgbHdkID0gMikKCnBvbHlnb24oeCA9IGMoMzUsIDgwLCA4MCwgMzUpLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wsIDYwKSwKICAgICAgICBib3JkZXIgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wpKQoKCmggPC0gaGlzdChZX2NvbnN0X2xldmVsMWFfc2NhbGVkWywnY1NvaWxfbG5kX3N1bSddLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLDE1MCksIG1haW4gPSAnU29pbCBDYXJib24nLCB4bGFiID0gJ0d0QycpCmhpc3QodHJ1bmMoWV9jb25zdF93YXZlMDFfc2NhbGVkIFssJ2NTb2lsX2xuZF9zdW0nXSwgaCRicmVha3MpICwgCiAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwxNTApICwgYnJlYWtzID0gaCRicmVha3MsIGFkZCA9IFRSVUUpCgpydWcoWV9jb25zdF9zdGFuX3NjYWxlZFsnY1NvaWxfbG5kX3N1bSddLCBsd2QgPSAyKQoKcG9seWdvbih4ID0gYyg3NTAsIDMwMDAsIDMwMDAsIDc1MCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCwgNjApLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCkpCgpoIDwtIGhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLDE1MCksIG1haW4gPSAnVmVnZXRhdGlvbiBDYXJib24nLCB4bGFiID0gJ0d0QycpCmhpc3QodHJ1bmMoWV9jb25zdF93YXZlMDFfc2NhbGVkIFssJ2NWZWdfbG5kX3N1bSddLCBoJGJyZWFrcykgLCAKICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwxNTApICAsIGJyZWFrcyA9IGgkYnJlYWtzLCBhZGQgPSBUUlVFKQoKcnVnKFlfY29uc3Rfc3Rhbl9zY2FsZWRbJ2NWZWdfbG5kX3N1bSddLCBsd2QgPSAyKQoKcG9seWdvbih4ID0gYygzMDAsIDgwMCwgODAwLCAzMDApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wsIDYwKSwKICAgICAgIGJvcmRlciA9ICBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wpKQoKCgpyZXNldCgpCgpsZWdlbmQoJ3RvcCcsIGhvcml6ID0gVFJVRSwgZmlsbCA9IGMobWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwgMTUwKSwgbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgMTUwKSwgbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCkpLCBsZWdlbmQgPSBjKCdXYXZlMDAnLCAnV2F2ZTAxJywgJ0FXIHJhbmdlJykpCgojZGV2Lm9mZigpCmBgYAoKIyMgV2hhdCBwcm9wb3J0aW9uIG9mIHdhdmUwMSBmYWxsIHdpdGhpbiBBbmR5IFdpbHRzaGlyZSdzIGNvbnN0cmFpbnRzPwoKSnVzdCB1bmRlciBhIHRoaXJkLiBQb2ludHMgYXQgYSBzaWduaWZpY2FudCBtb2RlbCBkaXNjcmVwZW5jeSBpbiBjVmVnCgpPZiB0aGUgNDAwIG1lbWJlcnMgb2YgdGhlIHdhdmUwMSBlbnNlbWJsZSwgMTI4IHBhc3MgQW5keSBXaWx0c2hpcmUncyBMZXZlbCAyIGNvbnN0cmFpbnRzLgoKYGBge3J9CgpsZW5ndGgobGV2ZWwyX2l4X3dhdmUwMSkKbGVuZ3RoKGxldmVsMl9peF93YXZlMDEpIC8gbnRyYWluX3dhdmUwMQoKCmBgYAoKCgpgYGB7ciBwbG90LWNhcmJvbi1jeWNsZS10aW1lc2VyaWVzLXByaW1hcnksIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTJ9CgpsY29sX3dhdmUwIDwtIG1ha2VUcmFuc3BhcmVudCgnZG9kZ2VyYmx1ZTInLCAgMTIwKQpsY29sX3dhdmUwMSA8LSBtYWtlVHJhbnNwYXJlbnQoJ2ZpcmVicmljaycsICAxMjApCmxjb2xfd2F2ZTAxX2xldmVsMiA8LSAnZ29sZCcKc3RhbmNvbCA9ICdibGFjaycKCmxpbmVQbG90TXVsdGlFbnMgPC0gZnVuY3Rpb24oeWVhcnMsIGVuczEsIGVuczIsIGVuczMsIGNvbDEsIGNvbDIsIGNvbDMsIHlsYWIsIG1haW4sIHlsaW0gPSBOVUxMLCAuLi4pewogICMgUGxvdCB3YXZlMDAgYW5kIHdhdmUwMSB0aW1lc2VyaWVzIG9uIHRvcCBvZiBvbmUgYW5vdGhlcgogIAogIG50IDwtIGxlbmd0aCh5ZWFycykgCiAgaWYoaXMubnVsbCh5bGltKSl7CiAgICAKICB5bGltID0gcmFuZ2UoYyhlbnMxWywxXSwgZW5zMVssbnRdLCBlbnMyWywxXSwgZW5zMlsgLG50XSwgZW5zM1ssMV0sIGVuczNbLCBudF0pKQogIH0KICAKICBlbHNlIHlsaW0gPC0geWxpbQogIAogIG1hdHBsb3QoeWVhcnMsIHQoZW5zMSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IGNvbDEsCiAgICAgICAgeWxhYiA9IHlsYWIsIG1haW4gPSBtYWluLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nLCAuLi4pCiAgbWF0bGluZXMoeWVhcnMsIHQoZW5zMiksIGNvbCA9IGNvbDIsIGx0eSA9ICdzb2xpZCcpCiAgICBtYXRsaW5lcyh5ZWFycywgdChlbnMzKSwgY29sID0gY29sMywgbHR5ID0gJ3NvbGlkJykKfQoKI3BkZihmaWxlID0gJ2ZpZ3MvZmlnMDMucGRmJywgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTIpCiNwZGYoZmlsZSA9ICdmaWdzL2NhcmJvbi1jeWNsZS10aW1lc2VyaWVzLXdhdmVzLWNvbnN0cmFpbmVkLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyKQpwYXIobWZyb3c9IGMoMyw1KSwgbGFzID0gMSwgbWFyID0gYyg0LDQsMSwwKSkKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IG5wcF9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IG5wcF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5wcF9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05QUCcpCgpsaW5lcyh5ZWFycyxucHBfc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9ICBuYnBfZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLCAKICAgICAgICAgICAgICAgICBlbnMyID0gbmJwX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gbmJwX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSxjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdOQlAnLCB5bGltID0gYygtMTAsMTApKQoKbGluZXMoeWVhcnMsIG5icF9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gY1NvaWxfZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjU29pbF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNTb2lsX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1NvaWwnLCB5bGltID0gcmFuZ2UoYyhjU29pbF9lbnNfd2F2ZTAwWywxXSwgY1NvaWxfZW5zX3dhdmUwMFssMTY0XSkpKQoKbGluZXMoeWVhcnMsIGNTb2lsX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBjVmVnX2Vuc193YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gY1ZlZ19lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNWZWdfZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjVmVnJykKCmxpbmVzKHllYXJzLCBjVmVnX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdMYWknKQoKbGluZXMoeWVhcnMsIGxhaV9sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gcmhfbG5kX3N1bV9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IHJoX2xuZF9zdW1fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSByaF9sbmRfc3VtX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1JIJykKCmxpbmVzKHllYXJzLCByaF9sbmRfc3VtX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdmTHVjJykKCmxpbmVzKHllYXJzLCBmTHVjX2xuZF9zdW1fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2ZIYXJ2ZXN0JykKCmxpbmVzKHllYXJzLCBmSGFydmVzdF9sbmRfc3VtX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IHRyZWVGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAndHJlZWZyYWMnCiAgICAgICAgICAgICAgICAgKQoKbGluZXMoeWVhcnMsIHRyZWVGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnc2hydWJmcmFjJwopCgpsaW5lcyh5ZWFycywgc2hydWJGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYmFyZXNvaWxmcmFjJykKCmxpbmVzKHllYXJzLCBiYXJlc29pbEZyYWNfbG5kX21lYW5fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdjM1BmdEZyYWMnKQoKbGluZXMoeWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2MzUGZ0RnJhYycpCgpsaW5lcyh5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsJ3dhdmUwMScsJ3dhdmUwMSBsZXZlbDInLCdzdGFuZGFyZCcpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAxLjUsIGNvbCA9IGMobGNvbF93YXZlMCwgbGNvbF93YXZlMDEsIGxjb2xfd2F2ZTAxX2xldmVsMiwgc3RhbmNvbCksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgojZGV2Lm9mZigpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTJ9CgojcGRmKGZpbGUgPSAnZmlncy9maWcwNC5wZGYnLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMikKI3BkZihmaWxlID0gJ2ZpZ3MvY2FyYm9uLWN5Y2xlLXRpbWVzZXJpZXMtYW5vbWFseS13YXZlcy1jb25zdHJhaW5lZC5wZGYnLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMikKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMCkpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBucHBfZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IG5wcF9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gbnBwX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdOUFAnKQoKbGluZXMoeWVhcnMsbnBwX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gIG5icF9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwgCiAgICAgICAgICAgICAgICAgZW5zMiA9IG5icF9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gbmJwX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05CUCcsIHlsaW0gPSBjKC0xMCwxMCkpCgpsaW5lcyh5ZWFycywgbmJwX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGNTb2lsX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjU29pbF9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gY1NvaWxfZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2NTb2lsJywgeWxpbSA9IHJhbmdlKGMoY1NvaWxfZW5zX2Fub21fd2F2ZTAwWywxXSwgY1NvaWxfZW5zX2Fub21fd2F2ZTAwWywxNjRdKSkpCgpsaW5lcyh5ZWFycywgY1NvaWxfc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gY1ZlZ19lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gY1ZlZ19lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gY1ZlZ19lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1ZlZycpCgpsaW5lcyh5ZWFycywgY1ZlZ19zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBsYWlfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGxhaV9sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gbGFpX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdMYWknKQoKbGluZXMoeWVhcnMsIGxhaV9sbmRfbWVhbl9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSByaF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSByaF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSByaF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCAgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnUkgnKQoKbGluZXMoeWVhcnMsIHJoX2xuZF9zdW1fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gZkx1Y19sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmTHVjX2xuZF9zdW1fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGZMdWNfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnZkx1YycpCgpsaW5lcyh5ZWFycywgZkx1Y19sbmRfc3VtX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKIApsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdmSGFydmVzdCcpCgpsaW5lcyh5ZWFycywgZkhhcnZlc3RfbG5kX3N1bV9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAndHJlZWZyYWMnCiAgICAgICAgICAgICAgICAgKQoKbGluZXMoeWVhcnMsIHRyZWVGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IHNocnViRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdzaHJ1YmZyYWMnCikKCmxpbmVzKHllYXJzLCBzaHJ1YkZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2JhcmVzb2lsZnJhYycpCgpsaW5lcyh5ZWFycywgYmFyZXNvaWxGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBjM1BmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdjM1BmdEZyYWMnKQoKbGluZXMoeWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBjNFBmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYzNQZnRGcmFjJykKCmxpbmVzKHllYXJzLCBjNFBmdEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsJ3dhdmUwMScsJ3dhdmUwMSBsZXZlbDInLCdzdGFuZGFyZCcpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAxLjUsIGNvbCA9IGMobGNvbF93YXZlMCwgbGNvbF93YXZlMDEsIGxjb2xfd2F2ZTAxX2xldmVsMiwgc3RhbmNvbCksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgoKI2Rldi5vZmYoKQoKYGBgIAoKIyMgRXhwbG9yaW5nIHN1bW1hcnkgb2YgY29uc3RyYWludDogQ3VtdWxhdGl2ZSBOQlAKCgojIyMgQ2FyYm9uIGJ1ZGdldCBkYXRhCgpbU2VjdGlvbiAyLjUgaW4gRnJpZWRsaW5nc3RlaW4gZXQgYWwuXShodHRwczovL2Vzc2QuY29wZXJuaWN1cy5vcmcvYXJ0aWNsZXMvMTIvMzI2OS8yMDIwLyNzZWN0aW9uMikgZGVzY3JpYmVzIGhvdyB0aGUgbGFuZCBjYXJib24gc2luayBpcyBlc3RpbWF0ZWQuCmBgYHtyLCBoaXN0b3JpY2FsLWNhcmJvbi1idWRnZXQsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMH0KCiNwZGYoZmlsZSA9ICdjYXJib25fYnVkZ2V0LnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgpCiMgUXVlc3Rpb246IEhvdyBjbG9zZWx5IHNob3VsZCBvdXIgbW9kZWwgbWF0Y2ggdGhpcyBjdXJ2ZT8gV2hpY2ggb3V0cHV0PwojIChNeSBndWVzcyBpcyAnVG90YWwgTGFuZCBDYXJib24gYW5vbWFseScpCmhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCA8LSByZWFkX2V4Y2VsKCdkYXRhL0dsb2JhbF9DYXJib25fQnVkZ2V0XzIwMjB2MS4wLnhsc3gnLCBzaGVldCA9ICJIaXN0b3JpY2FsIEJ1ZGdldCIsIHNraXAgPSAxNSwgbl9tYXggPSAyNzApCgpwYXIobWZyb3cgPSBjKDMsMikpCnlsaW0gPSBjKC0xLCA2KQoKCmxhbmRfc2lua19uZXQgPC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kIHNpbmtgIC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kLXVzZSBjaGFuZ2UgZW1pc3Npb25zYAoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBmb3NzaWwgZW1pc3Npb25zIGV4Y2x1ZGluZyBjYXJib25hdGlvbmAsIG1haW4gPSAnZm9zc2lsIGVtaXNzaW9ucyBleGNsdWRpbmcgY2FyYm9uYXRpb24nLCB5bGFiID0gJycsCiAgICAgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgbGFuZCBzaW5rYCwgbWFpbiA9ICdsYW5kIHNpbmsnLCB5bGFiID0gJycsIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgpsaW5lcyhoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgbGFuZF9zaW5rX25ldCwgY29sID0gJ3JlZCcpCgpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSAnbGFuZCBzaW5rIC0gbGFuZCB1c2UgY2hhbmdlIGVtaXNzaW9ucycsIGNvbCA9ICdyZWQnLCBsdHkgPSAnc29saWQnKQoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kLXVzZSBjaGFuZ2UgZW1pc3Npb25zYCwgbWFpbiA9ICdsYW5kIHVzZSBjaGFuZ2UgZW1pc3Npb25zJywKICAgICB5bGFiID0gJycsIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgpwbG90KGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRZZWFyLCBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGF0bW9zcGhlcmljIGdyb3d0aGAsIG1haW4gPSAnYXRtb3NwaGVyaWMgZ3Jvd3RoJywgeWxhYiA9ICcnLAogICAgIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBvY2VhbiBzaW5rYCwgbWFpbiA9ICdvY2VhbiBzaW5rJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgYnVkZ2V0IGltYmFsYW5jZWAsIG1haW4gPSAnYnVkZ2V0IGltYmFsYW5jZScsIHlsYWIgPSAnJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCiNkZXYub2ZmKCkKYGBgCklQQ0MgQVI2IENoYXB0ZXIgNSBzdGF0ZXM6ICJUaGUgbmV0IGxhbmQgY2FyYm9uIHNpbmsgaXMgdGFrZW4gYXMgbmV0IGJpb21lIHByb2R1Y3Rpdml0eSAoTkJQKSBhbmQgc28gaW5jbHVkZXMgYW55IG1vZGVsbGVkIG5ldCBsYW5kLXVzZSAKY2hhbmdlIGVtaXNzaW9ucy4gRnVydGhlciBkZXRhaWxzIG9uIGRhdGEgc291cmNlcyBhbmQgcHJvY2Vzc2luZyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjaGFwdGVyIGRhdGEgdGFibGUgKFRhYmxlIDUuU00uNikuIgoKVGhlIEdDUCBzYXlzOiAKIlRoZSBsYW5kIHNpbmsgaXMgdGhlIGF2ZXJhZ2Ugb2Ygc2V2ZXJhbCBkeW5hbWljIGdsb2JhbCB2ZWdldGF0aW9uIG1vZGVscyB0aGF0IHJlcHJvZHVjZSB0aGUgb2JzZXJ2ZWQgbWVhbiB0b3RhbCBsYW5kIHNpbmsgb2YgdGhlIDE5OTBzLiIKCkFSNiBDaGFwdGVyIDUgc3RhdGVzOiAgIlRoZSBsYW5kIGNhcmJvbiBjeWNsZSBjb21wb25lbnRzIG9mIGhpc3RvcmljYWwgRVNNIHNpbXVsYXRpb25zIHNob3cgYSBsYXJnZXIgcmFuZ2UsIHdpdGggc2ltdWxhdGVkIGN1bXVsYXRpdmUgbGFuZCBjYXJib24gdXB0YWtlICgxODUw4oCTMjAxNCkgc3Bhbm5pbmcgdGhlIHJhbmdlIGZyb20g4oCTNDcgdG8gKzIxIEd0QywgY29tcGFyZWQgdG8gdGhlIEdDUCBlc3RpbWF0ZSBvZiDigJMxMiDCsSA1MCBHdEMgKEZpZ3VyZSA1LjIzYikuCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodCA9IDd9CgoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kIHNpbmtgLAogICAgIG1haW4gPSAnbGFuZCBzaW5rJywgeWxhYiA9ICcnLCB0eXBlID0gJ2wnLCBidHkgPSAnbicsIHlsaW0gPSB5bGltKQoKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGN1bXN1bShoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGxhbmQgc2lua2ApLAogICAgIG1haW4gPSAnbGFuZCBzaW5rJywgeWxhYiA9ICcnLCB0eXBlID0gJ2wnLCBidHkgPSAnbicpCgoKI3Bsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGN1bXN1bShsYW5kX3NpbmtfbmV0LCBuYS5ybSA9IFRSVUUpLAojICAgICBtYWluID0gJ2xhbmQgc2luaycsIHlsYWIgPSAnJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nKQoKbWF0Y2hfeWVhcnNfaXggPC0gd2hpY2goaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIgJWluJSAxODUwOjIwMTMpCgptYXRjaF95ZWFycyA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhclttYXRjaF95ZWFyc19peF0KY3VtdWxhdGl2ZV9uZXRfbGFuZF9zaW5rIDwtIGN1bXN1bShsYW5kX3NpbmtfbmV0W21hdGNoX3llYXJzX2l4XSkKCgpwYXIobGFzID0gMSkKcGxvdChtYXRjaF95ZWFycywgY3VtdWxhdGl2ZV9uZXRfbGFuZF9zaW5rLAogICAgIHR5cGUgPSAnbCcsIG1haW4gPSAiQ3VtdWxhdGl2ZSBOZXQgTGFuZCBTaW5rIiwgeGxhYiA9ICIiLCB5bGFiID0gIkd0QyIsCiAgICAgeWxpbSA9IGMoLTgwLCAyMCkpCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuaGVpZ2h0ID0gOH0KCnBhcihtYXIgPSBjKDgsNCw0LDEpLCBsYXMgPSAxKQpjbmJwX2Vuc193YXZlMDAgPC0gdChhcHBseShuYnBfZW5zX3dhdmUwMCwgMSwgRlVOID0gY3Vtc3VtKSkKY25icF9lbnNfd2F2ZTAxIDwtIHQoYXBwbHkobmJwX2Vuc193YXZlMDEsIDEsIEZVTiA9IGN1bXN1bSkpCmNuYnBfc3RhbiA8LSBjdW1zdW0obmJwX3N0YW4pCgoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gIGNuYnBfZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLCAKICAgICAgICAgICAgICAgICBlbnMyID0gY25icF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNuYnBfZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdDdW11bGF0aXZlIE5CUCAoR3RDKScsIG1haW4gPSAnQ3VtdWxhdGl2ZSBOQlAnLCB4bGltID0gYygxODUwLCAyMDM1KSkKCmxpbmVzKHllYXJzLCBjbmJwX3N0YW4sIGNvbCA9ICdibGFjaycsIGx3ZCA9IDIpCgpsaW5lcyhtYXRjaF95ZWFycywgY3VtdWxhdGl2ZV9uZXRfbGFuZF9zaW5rLCBsdHkgPSAnZGFzaGVkJywgY29sID0gJ2JsYWNrJykKCmFycm93cygyMDIyLC00NywgMjAyMiwyMSwgYW5nbGUgPSA5MCwgbGVuZ3RoID0gMC4wNSwgY29kZSA9IDMpCgphcnJvd3MoMjAzNSwoLTEyLTUwKSwgMjAzNSwoLTEyKzUwKSwgIGFuZ2xlID0gOTAsIGxlbmd0aCA9IDAuMDUsIGNvZGUgPSAzKQoKdGV4dCgyMDIyLCAzMCwgJ0FSNicsIGNleCA9IDAuOCkKCnRleHQoMjAzNSwgNDcsICdHQ1AnLCBjZXggPSAwLjgpCnJlc2V0KCkKCgpsZWdlbmQoJ2JvdHRvbScsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsJ3dhdmUwMScsJ3dhdmUwMSBsZXZlbDInLCdzdGFuZGFyZCcsICdHQ1AgZXN0aW1hdGUnKSwgbHR5ID0gYygnc29saWQnLCAnc29saWQnLCAnc29saWQnLCAnc29saWQnLCAnZGFzaGVkJyksIGx3ZCA9IDEuNSwgY29sID0gYyhsY29sX3dhdmUwLCBsY29sX3dhdmUwMSwgbGNvbF93YXZlMDFfbGV2ZWwyLCBzdGFuY29sLCBzdGFuY29sKSwgaG9yaXogPSBGQUxTRSwgaW5zZXQgPSAwLjAxLCBjZXggPSAwLjgpCgoKYGBgCgoKCgojIEhvdyBtdWNoIGFyZSBhbGwgc2VsZWN0IG91dHB1dCBjb25zdHJhaW5lZD8KYGBge3J9CgpzZWxlY3RlZF90YWdzIDwtIGMoJ25wcCcsICduYnAnLCAnY1NvaWwnLCAnY1ZlZycsICdsYWlfbG5kX21lYW4nLCAncmhfbG5kX3N1bScsICdmTHVjX2xuZF9zdW0nLCAnZkhhcnZlc3RfbG5kX3N1bScsICd0cmVlRnJhY19sbmRfbWVhbicsICdzaHJ1YkZyYWNfbG5kX21lYW4nLCAnYmFyZXNvaWxGcmFjX2xuZF9tZWFuJywgJ2MzUGZ0RnJhY19sbmRfbWVhbicsICdjNFBmdEZyYWNfbG5kX21lYW4nKQoKIyB3YXZlMDAKc2VsZWN0ZWRfdGFnc192ZWNfd2F2ZTAwIDwtIHBhc3RlMChzZWxlY3RlZF90YWdzLCAnX2Vuc193YXZlMDAnKQoKbXZfbWVhbnNfd2F2ZTAwIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX3dhdmUwMCkpCmNvbG5hbWVzKG12X21lYW5zX3dhdmUwMCkgPC0gc2VsZWN0ZWRfdGFncwoKZm9yKGkgaW4gMTpsZW5ndGgoc2VsZWN0ZWRfdGFnc192ZWNfd2F2ZTAwKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY193YXZlMDBbaV0pCiAgCiAgY29saXggPC0gMTpuY29sKGRhdCkKICB0cnVuY19kYXQgPC0gZGF0WywgdGFpbChjb2xpeCwyMCldCiAgCiAgbWVhbl9kYXQgPC0gYXBwbHkodHJ1bmNfZGF0LCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgbXZfbWVhbnNfd2F2ZTAwWyxpIF0gPC0gbWVhbl9kYXQKICAKfQoKIyMgd2F2ZTAxCnNlbGVjdGVkX3RhZ3NfdmVjX3dhdmUwMSA8LSBwYXN0ZTAoc2VsZWN0ZWRfdGFncywgJ19lbnNfd2F2ZTAxJykKbXZfbWVhbnNfd2F2ZTAxIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX3dhdmUwMSkpCmNvbG5hbWVzKG12X21lYW5zX3dhdmUwMSkgPC0gc2VsZWN0ZWRfdGFncwoKZm9yKGkgaW4gMTpsZW5ndGgoc2VsZWN0ZWRfdGFnc192ZWNfd2F2ZTAxKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY193YXZlMDFbaV0pCiAgCiAgY29saXggPC0gMTpuY29sKGRhdCkKICB0cnVuY19kYXQgPC0gZGF0WywgdGFpbChjb2xpeCwyMCldCiAgCiAgbWVhbl9kYXQgPC0gYXBwbHkodHJ1bmNfZGF0LCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgbXZfbWVhbnNfd2F2ZTAxWyxpIF0gPC0gbWVhbl9kYXQKICAKfQoKCiMgd2F2ZTAwIGFub21hbHkKc2VsZWN0ZWRfdGFnc192ZWNfYW5vbV93YXZlMDAgPC0gcGFzdGUwKHNlbGVjdGVkX3RhZ3MsICdfZW5zX2Fub21fd2F2ZTAwJykKCm12X21lYW5zX2Fub21fd2F2ZTAwIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX2Fub21fd2F2ZTAwKSkKY29sbmFtZXMobXZfbWVhbnNfYW5vbV93YXZlMDApIDwtIHNlbGVjdGVkX3RhZ3MKCmZvcihpIGluIDE6bGVuZ3RoKHNlbGVjdGVkX3RhZ3NfdmVjX2Fub21fd2F2ZTAwKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY19hbm9tX3dhdmUwMFtpXSkKICAKICBjb2xpeCA8LSAxOm5jb2woZGF0KQogIHRydW5jX2RhdCA8LSBkYXRbLCB0YWlsKGNvbGl4LDIwKV0KICAKICBtZWFuX2RhdCA8LSBhcHBseSh0cnVuY19kYXQsIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkKICBtdl9tZWFuc19hbm9tX3dhdmUwMFssaSBdIDwtIG1lYW5fZGF0CiAgCn0KCiMgd2F2ZTAxIGFub21hbHkKc2VsZWN0ZWRfdGFnc192ZWNfYW5vbV93YXZlMDEgPC0gcGFzdGUwKHNlbGVjdGVkX3RhZ3MsICdfZW5zX2Fub21fd2F2ZTAxJykKCm12X21lYW5zX2Fub21fd2F2ZTAxIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX2Fub21fd2F2ZTAxKSkKY29sbmFtZXMobXZfbWVhbnNfYW5vbV93YXZlMDEpIDwtIHNlbGVjdGVkX3RhZ3MKCmZvcihpIGluIDE6bGVuZ3RoKHNlbGVjdGVkX3RhZ3NfdmVjX2Fub21fd2F2ZTAxKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY19hbm9tX3dhdmUwMVtpXSkKICAKICBjb2xpeCA8LSAxOm5jb2woZGF0KQogIHRydW5jX2RhdCA8LSBkYXRbLCB0YWlsKGNvbGl4LDIwKV0KICAKICBtZWFuX2RhdCA8LSBhcHBseSh0cnVuY19kYXQsIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkKICBtdl9tZWFuc19hbm9tX3dhdmUwMVssaSBdIDwtIG1lYW5fZGF0CiAgCn0KCmBgYAoKYGBge3J9CgpyYW5nZV93YXZlMDAgPC0gYXBwbHkobXZfbWVhbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sIDIgLCByYW5nZSkgIyBXYXZlMDAgc2V0cyB0aGUgaW5pdGlhbCByYW5nZQpyYW5nZV93YXZlMDEgPC0gYXBwbHkobXZfbWVhbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sIDIsIHJhbmdlKQpyYW5nZV93YXZlMDFfbGV2ZWwyYSA8LSBhcHBseShtdl9tZWFuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sIDIsIHJhbmdlKQoKIyBXaGF0IGlzIHRoZSBvdXRwdXQgcmFuZ2Ugb2YgdGhlIGxldmVsMmEgbW9kZXJuIHZhbHVlLCBleHByZXNzZWQgYXMgYSBwcm9wb3J0aW9uIG9mIHRoZSBpbml0aWFsIGVuc2VtYmxlPwpyYW5nZV9wcm9wX3dhdmUwMV9sZXZlbDJhIDwtICAoYXBwbHkocmFuZ2Vfd2F2ZTAxX2xldmVsMmEsIDIsIGRpZmYpIC8gYXBwbHkocmFuZ2Vfd2F2ZTAwLCAyLCBkaWZmKSkgKjEwMAoKCnJhbmdlX2Fub21fd2F2ZTAwIDwtIGFwcGx5KG12X21lYW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sIDIgLCByYW5nZSkgIyBXYXZlMDAgc2V0cyB0aGUgaW5pdGlhbCByYW5nZQpyYW5nZV9hbm9tX3dhdmUwMSA8LSBhcHBseShtdl9tZWFuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLCAyLCByYW5nZSkKcmFuZ2VfYW5vbV93YXZlMDFfbGV2ZWwyYSA8LSBhcHBseShtdl9tZWFuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwgMiwgcmFuZ2UpCgojIFdoYXQgaXMgdGhlIG91dHB1dCByYW5nZSBvZiB0aGUgbGV2ZWwyYSBtb2Rlcm4gdmFsdWUsIGV4cHJlc3NlZCBhcyBhIHByb3BvcnRpb24gb2YgdGhlIGluaXRpYWwgZW5zZW1ibGU/CnJhbmdlX3Byb3BfYW5vbV93YXZlMDFfbGV2ZWwyYSA8LSAgKGFwcGx5KHJhbmdlX2Fub21fd2F2ZTAxX2xldmVsMmEsIDIsIGRpZmYpIC8gYXBwbHkocmFuZ2VfYW5vbV93YXZlMDAsIDIsIGRpZmYpKSAqMTAwCgoKYGBgCgpgYGB7cn0KYWxsX3dhdmVzX212IDwtIHJiaW5kKG12X21lYW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLCBtdl9tZWFuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSkKCnJhbmdlX2FsbF93YXZlcyA8LSBhcHBseShhbGxfd2F2ZXNfbXYsIDIsIHJhbmdlKQoKbGV2ZWwyX2l4X2FsbF93YXZlc19tdiA8LSB3aGljaChhbGxfd2F2ZXNfbXZbLCduYnAnXSA+IDAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3dhdmVzX212WywnbnBwJ10gPiAzNSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfd2F2ZXNfbXZbLCducHAnXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF93YXZlc19tdlssJ2NTb2lsJ10gPiA3NTAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3dhdmVzX212WywnY1NvaWwnXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3dhdmVzX212WywnY1ZlZyddID4gMzAwICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF93YXZlc19tdlssJ2NWZWcnXSA8IDgwMAopCgphbGxfd2F2ZXNfbXZfbGV2ZWwyIDwtIGFsbF93YXZlc19tdltsZXZlbDJfaXhfYWxsX3dhdmVzX212LCBdCgoKYWxsX3dhdmVzX2NvbCA8LSByZXAoenJlZCwgbnJvdyhhbGxfd2F2ZXNfbXYpKQoKYWxsX3dhdmVzX2xldmVsMl9jb2wgPC0gYWxsX3dhdmVzX2NvbAphbGxfd2F2ZXNfbGV2ZWwyX2NvbFtsZXZlbDJfaXhfYWxsX3dhdmVzX212XSA8LSB6Ymx1ZQoKcmFuZ2VfYWxsX3dhdmVzX2xldmVsMiA8LSBhcHBseShhbGxfd2F2ZXNfbXZbbGV2ZWwyX2l4X2FsbF93YXZlc19tdiwgXSwgMiwgcmFuZ2UpCgpyYW5nZV9wcm9wX2FsbF93YXZlc19sZXZlbDIgPC0oYXBwbHkocmFuZ2VfYWxsX3dhdmVzX2xldmVsMiwgMiwgZGlmZikgLyBhcHBseShyYW5nZV9hbGxfd2F2ZXMsIDIsIGRpZmYpKSAqMTAwCgojIEFub21hbHkKYWxsX3dhdmVzX2Fub21fbXYgPC0gcmJpbmQobXZfbWVhbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwgbXZfbWVhbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSkKCnJhbmdlX2FsbF93YXZlc19hbm9tIDwtIGFwcGx5KGFsbF93YXZlc19hbm9tX212LCAyLCByYW5nZSkKCmFsbF93YXZlc19hbm9tX212X2xldmVsMiA8LSBhbGxfd2F2ZXNfYW5vbV9tdltsZXZlbDJfaXhfYWxsX3dhdmVzX212LCBdCgpyYW5nZV9hbGxfd2F2ZXNfYW5vbV9sZXZlbDIgPC0gYXBwbHkoYWxsX3dhdmVzX2Fub21fbXZbbGV2ZWwyX2l4X2FsbF93YXZlc19tdiwgXSwgMiwgcmFuZ2UpCgpyYW5nZV9wcm9wX2FsbF93YXZlc19hbm9tX2xldmVsMiA8LShhcHBseShyYW5nZV9hbGxfd2F2ZXNfYW5vbV9sZXZlbDIsIDIsIGRpZmYpIC8gYXBwbHkocmFuZ2VfYWxsX3dhdmVzX2Fub20sIDIsIGRpZmYpKSAqMTAwCgoKCgpgYGAKCiMjIyBDb25zdHJhaW50IG9mIG91dHB1dCBhdCBsZXZlbCAyClByb3BvcnRpb24gb2YgdGhlIGluaXRpYWwgcmFuZ2Ugb2YgbW9kZWwgb3V0cHV0IHRoYXQgaXMgY292ZXJlZCBieSBsZXZlbCAyIGNvbnN0cmFpbmVkIGVuc2VtYmxlICglKToKYGBge3J9CnByaW50KHJvdW5kKHJhbmdlX3Byb3BfYWxsX3dhdmVzX2xldmVsMiwxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKYGBgCgoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0KCgpyYW5nZV9wcm9wX3JvdW5kID0gcm91bmQocmFuZ2VfcHJvcF9hbGxfd2F2ZXNfbGV2ZWwyLDEpCnJhbmdlX3Byb3Bfcm91bmRfbWF0IDwtIHJiaW5kKHJhbmdlX3Byb3Bfcm91bmQsICgxMDAgLSByYW5nZV9wcm9wX3JvdW5kKSkKCnJhbmdlX3Byb3BfYW5vbV9yb3VuZCA9IHJvdW5kKHJhbmdlX3Byb3BfYWxsX3dhdmVzX2Fub21fbGV2ZWwyLDEpCnJhbmdlX3Byb3BfYW5vbV9yb3VuZF9tYXQgPC0gcmJpbmQocmFuZ2VfcHJvcF9hbm9tX3JvdW5kLCAoMTAwIC0gcmFuZ2VfcHJvcF9hbm9tX3JvdW5kKSkKCnBhcihsYXMgPSAxLCBtYXIgPSBjKDgsMSwzLDIpLCBtZnJvdyA9IGMoMSwyKSwgb21hID0gYygxLDEwLCAxLDEpKQpiYXJwbG90KHQoYXBwbHkocmFuZ2VfcHJvcF9yb3VuZF9tYXQsMSxyZXYpKSwgCiAgICAgICAgaG9yaXogPSBUUlVFLAogICAgICAgIGNvbCA9ICBjKCB6Ymx1ZSwgenJlZCksCiAgICAgICAgeGxhYiA9ICdFbnNlbWJsZSBvdXRwdXQgcmFuZ2UgKCUpJywKICAgICAgICBtYWluID0gJ0Fic29sdXRlJwogICAgICAgICkKCmJhcnBsb3QodChhcHBseShyYW5nZV9wcm9wX2Fub21fcm91bmRfbWF0LDEscmV2KSksIAogICAgICAgIGhvcml6ID0gVFJVRSwKICAgICAgICBjb2wgPSAgYyggemJsdWUsIHpyZWQpLAogICAgICAgIHhsYWIgPSAnRW5zZW1ibGUgb3V0cHV0IHJhbmdlICglKScsCiAgICAgICAgbmFtZXMuYXJnID0gcmVwKCcnLCAxMyksCiAgICAgICAgbWFpbiA9ICdBbm9tYWx5JwogICAgICAgICkKYXhpcygxKQpyZXNldCgpCmxlZ2VuZCgnYm90dG9tJywgbGVnZW5kID0gYygnTlJPWScsICdSdWxlZCBvdXQnKSwgZmlsbCA9IGMoemJsdWUsIHpyZWQpLCBob3JpeiA9IFRSVUUsIGluc2V0ID0gMC4wMiApCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuaGVpZ2h0ID0gOH0KCgpheGF0ID0gbGVuZ3RoKHJhbmdlX3Byb3Bfcm91bmQpOjEKCnBhcihsYXMgPSAxLCBtYXIgPSBjKDUsMTAsMywyKSwgeGF4cyA9ICdpJykKcGxvdChyZXYocmFuZ2VfcHJvcF9yb3VuZCksIGF4YXQsIHhsaW0gPSBjKDAsMTAwKSwgYXhlcyA9IEZBTFNFLCB0eXBlID0gJ24nLCB5bGFiID0gJycsIHhsYWIgPSAnTGV2ZWwgMiBOUk9ZIHByb3BvcnRpb24gb2Ygd2hvbGUgcmFuZ2UgKCUpJykKI2FibGluZShoID0gYXhhdCwgY29sID0gJ2dyZXknLCBsdHkgPSAnZGFzaGVkJykKI2FibGluZSh2ID0gMTAwKQpwb2ludHMocmV2KHJhbmdlX3Byb3BfYW5vbV9yb3VuZCksIHJldihheGF0KSwgY29sID0gJ2dyZXknLCBwY2ggPSAxOSkKc2VnbWVudHMoeDAgPSAwLCB5MCA9IHJldihheGF0KSwgeDEgPSByZXYocmFuZ2VfcHJvcF9hbm9tX3JvdW5kKSwgeTEgPSByZXYoYXhhdCksIGNvbCA9ICdncmV5JywgbHR5ID0gJ2Rhc2hlZCcpCgoKcG9pbnRzKHJldihyYW5nZV9wcm9wX3JvdW5kKSwgcmV2KGF4YXQpLCBjb2wgPSAnYmxhY2snLCBwY2ggPSAxOSkKc2VnbWVudHMoeDAgPSAwLCB5MCA9IHJldihheGF0KSwgeDEgPSByZXYocmFuZ2VfcHJvcF9yb3VuZCksIHkxID0gcmV2KGF4YXQpKQojc2VnbWVudHMoeDAgPSAwLCB5MCA9IHJldihheGF0KSwgeDEgPSByZXYocmFuZ2VfcHJvcF9hbm9tX3JvdW5kKSwgeTEgPSByZXYoYXhhdCksIGNvbCA9ICdncmV5JywgbHR5ID0gJ2Rhc2hlZCcpCgpheGlzKDIsIGF0ICA9IGF4YXQsIGxhYmVscyA9IHNlbGVjdGVkX3RhZ3MpCmF4aXMoMSkKcmVzZXQoKQpsZWdlbmQoJ3RvcCcsIGMoJ0Fic29sdXRlJywgJ0Fub21hbHknKSwgcGNoID0gMTksIGNvbCA9IGMoJ2JsYWNrJywgJ2dyZXknKSwgaG9yaXogPSBUUlVFLCBpbnNldCA9IDAuMDMpCgoKYGBgCgoKIyMjIFBhaXJzIHBsb3Qgb2YgMmQgcHJvamVjdGlvbnMgb2YgY29uc3RyYWluZWQgb3V0cHV0IHNwYWNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgpwYWlycyhhbGxfd2F2ZXNfbXYsIGNvbCA9IGFsbF93YXZlc19sZXZlbDJfY29sLCBsb3dlci5wYW5lbCA9IE5VTEwsIGdhcCA9IDApCnJlc2V0KCkKbGVnZW5kKCdsZWZ0JywgbGVnZW5kID0gYygnTlJPWScsICdSdWxlZCBvdXQnICkKCmBgYAoKCgoKIyMgQ29uc3RyYWluaW5nIHRvIGxldmVsIDIgd2l0aCB0aGUgZW11bGF0b3IKCgoKYGBge3J9Cm51bmlmIDwtIDUwMDAwClhfdW5pZiA8LSBzYW1wX3VuaWYobnVuaWYsIG1pbnMgPSByZXAoMCwzMiksIG1heGVzID0gcmVwKDEsIDMyKSkKY29sbmFtZXMoWF91bmlmKSA8LSBjb2xuYW1lcyhYKQpgYGAKCgoKYGBge3J9CgojIENhbiB0aGlzIGdvIGluIGNvbW1vbiBkYXRhPyBXb3VsZCBiZSBuZWVkZWQgZm9yIGNoZWNraW5nIGVtdWxhdG9yIGZpdHMKIyBDcmVhdGUgZml0IGxpc3RzIGZvciB0aGUgY29tYmluZWQgZGF0YSB3YXZlMDAgbGV2ZWwgMWEgYW5kIHdhdmUwMQpZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9saXN0IDwtIG1hdDJsaXN0KFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkKQoKZml0X2xpc3RfY29uc3RfbGV2ZWwxYV93YXZlMDEgPC0gbWNsYXBwbHkoWCA9IFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkX2xpc3QgLCBGVU4gPSBrbSwgZm9ybXVsYSA9IH4uLCBkZXNpZ24gPSBYX2xldmVsMWFfd2F2ZTAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jLmNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QodHJhY2UgPSBGQUxTRSkpCgoKYGBgCgoKYGBge3J9CgpZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9wcmVkIDwtIG11bHRpUHJlZChZID0gWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWQsIFhwcmVkID0gWF91bmlmLCBmaXRfbGlzdCA9IGZpdF9saXN0X2NvbnN0X2xldmVsMWFfd2F2ZTAxKQoKYGBgCgoKCmBgYHtyfQoKCmxldmVsMl9peF9lbV91bmlmX3dhdmUwMF93YXZlMDEgPC0gd2hpY2goWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfcHJlZCRwcmVkX21lYW5bLCduYnBfbG5kX3N1bSddID4gMCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9wcmVkJHByZWRfbWVhblssJ25wcF9ubGltX2xuZF9zdW0nXSA+IDM1ICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9wcmVkJHByZWRfbWVhblssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkX3ByZWQkcHJlZF9tZWFuWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkX3ByZWQkcHJlZF9tZWFuWywnY1NvaWxfbG5kX3N1bSddIDwgMzAwMCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9wcmVkJHByZWRfbWVhblssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9wcmVkJHByZWRfbWVhblssJ2NWZWdfbG5kX3N1bSddIDwgODAwCikKCgoobGVuZ3RoKGxldmVsMl9peF9lbV91bmlmX3dhdmUwMF93YXZlMDEpIC8gbnVuaWYpICogMTAwCgpgYGAKCgpgYGB7cn0KWF9zdGFuX25vcm0gPC0gbm9ybWFsaXplKG1hdHJpeChyZXAoMSwgMzIpLCBucm93ID0gMSksIHdydCA9IGxocykKCmNvbG5hbWVzKFhfdW5pZikgPC0gMTozMgoKYGBgCgoKYGBge3IsZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMiwgd2FybmluZyA9IEZBTFNFfQoKI3BkZihmaWxlID0gJ2ZpZ3MvZmlnMDYucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTIpCiNwZGYoZmlsZSA9ICdmaWdzL3BhaXJzX2xldmVsMl9peF9lbV91bmlmX3dhdmUwMF93YXZlMDEucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTIpCgpwYXIob21hID0gYygwLDAsMCwzKSwgYmcgPSAnd2hpdGUnKQoKcGFuZWxfaGlzdF9sb2NhbCA8LSBmdW5jdGlvbih4LCAuLi4pCnsKICAgIHVzciA8LSBwYXIoInVzciIpOyBvbi5leGl0KHBhcih1c3IpKQogICAgcGFyKHVzciA9IGModXNyWzE6Ml0sIDAsIDEuNSkgKQogICAgaCA8LSBoaXN0KHgsIHBsb3QgPSBGQUxTRSkKICAgIGJyZWFrcyA8LSBoJGJyZWFrczsgbkIgPC0gbGVuZ3RoKGJyZWFrcykKICAgIHkgPC0gaCRjb3VudHM7IHkgPC0geS9tYXgoeSkKICAgIHJlY3QoYnJlYWtzWy1uQl0sIDAsIGJyZWFrc1stMV0sIHksIGNvbCA9ICJjeWFuIiwgLi4uKQp9CgpwYWlycyhyYmluZChYX3VuaWZbbGV2ZWwyX2l4X2VtX3VuaWZfd2F2ZTAwX3dhdmUwMSwgXSwgWF9zdGFuX25vcm0pLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gZGZ1bmNfdXBfdHJ1dGgsCiAgICAgIGRpYWcucGFuZWwgPSBwYW5lbF9oaXN0X2xvY2FsLAogICAgICBjZXgubGFiZWxzID0gMSwKICAgICAgY29sLmF4aXMgPSAnd2hpdGUnLAogICAgICBkZnVuY19jb2wgPSByYgogICAgICApCgoKaW1hZ2UucGxvdChsZWdlbmQub25seSA9IFRSVUUsCiAgICAgICAgICAgemxpbSA9IGMoMCwxKSwKICAgICAgICAgICBjb2wgPSByYiwKICAgICAgICAgICBsZWdlbmQuYXJncyA9IGxpc3QodGV4dCA9ICdEZW5zaXR5IG9mIG1vZGVsIHJ1bnMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhJywgc2lkZSA9IDMsIGxpbmUgPSAxKSwKICAgICAgICAgICBsZWdlbmQuc2hyaW5rID0gMC42LAogICAgICAgICAgIGhvcml6b250YWwgPSBUUlVFCikKCmxlZ2VuZCgnbGVmdCcsIGxlZ2VuZCA9IHBhc3RlKDE6MzIsIGNvbG5hbWVzKGxocykpLCBjZXggPSAxLCBidHkgPSAnbicpCgojZGV2Lm9mZigpCmBgYAoKCgoK